home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / printing / printque.arc / PRINTQUE.S next >
Text File  |  1987-04-26  |  8KB  |  201 lines

  1. ;         .      .                .      
  2. ;
  3. ; PRINT QUEUE for the Atari ST     rev -      4/ 9/87
  4. ;                                  rev 0.9    4/26/87
  5. ; Copyright (C) 1987 by Wayne S. Arczynski
  6. ; All rights reserved
  7.  
  8. ; Equates
  9.  
  10. trap13:   equ    $B4              ; Bios trap vector location
  11. hwint:    equ    $100             ; MFP Vector 
  12.  
  13. ;                   __________________________
  14.  
  15.           Even                    ; get on even address
  16. pbegin:
  17. start:
  18.           lea    stack,SP         ; set stack pointer
  19.           bsr.l  commercial       ; do commercial
  20.           moveq  #0,D0      
  21.           move.w D0,inptr         ; set buffer pointers
  22.           move.w D0,outptr
  23.           clr.l  -(SP)
  24.           move.w #$20,-(SP)       ; goto SUPERVISOR mode
  25.           trap   #1
  26.           addq.l #6,SP
  27. SUPER:    lea    $FF8800,A0       ; GI Sound chip
  28.           move.w SR,-(SP)         ; Save SR
  29.           or.w   #$700,SR         ; disable int's
  30.           move.b #7,(A0)          ; select reg 7
  31.           move.b (A0),D1          ; get old reg value
  32.           or.b   #$80,D1          ; Set Port B to output
  33.           move.b D1,2(A0)         ; rewrite reg
  34.           move.w (SP)+,SR         ; restore int's
  35.  
  36.           move.l trap13,A0        ; get old trap vector
  37.           cmp.l  #'WsA0',-4(A0)   ; Check test
  38.           beq.s  abort            ; Already installed?
  39.  
  40.           move.l A0,otrap13       ; No. Install it
  41.           move.l #inque,trap13    ; point to new trap vector
  42.           move.l #outque,hwint    ; point to new interrupt handler
  43.           moveq  #0,D1
  44.           bclr   D1,$FFFA03       ; BUSY falling edge, AER
  45.           bset   D1,$FFFA15       ; Interrupt mask reg
  46.           bclr   D1,$FFFA11       ; Interrupt In-Service Register
  47.           bset   D1,$FFFA09       ; Enable interrupts
  48.           move.l D0,-(SP)         ; Old SSP
  49.           move.w #$20,-(SP)       ; leave SUPERVISOR mode
  50.           trap   #1
  51.           addq.l #6,SP
  52.            
  53. done:
  54.           move.w #0,-(SP)         ; no error
  55.           move.l #pend-pbegin,-(SP)   ; program size with buffer
  56.           move.w #$31,-(SP)       ; terminate and stay resident
  57.           trap   #1               ; call gem
  58.  
  59. abort:    move.l D0,-(SP)         ; Old SSP
  60.           move.w #$20,-(SP)       ; leave SUPERVISOR mode
  61.           trap   #1
  62.           addq.l #6,SP
  63.           clr.w  -(SP)            ; Terminate & free memory
  64.           trap   #1               ; call gem
  65.  
  66. commercial:
  67.           move.l #text,-(SP)      ; put text address on stack
  68.           move.w #9,-(SP)         ; PRINT LINE function code
  69.           trap   #1               ; call gem
  70.           addq.l #6,SP            ; Correct stack pointer
  71.           move.l #$100000,D2      ; wait a bit
  72. pause:    subq.l #1,D2
  73.           bne.s  pause          
  74.           rts
  75.  
  76. text:     dc.b   $1B,$45,$0D,$0A,$0D,$0A
  77.           dc.b   'Print Queue  (C) 1987 by WSA',$0D,$0A
  78.           dc.b   'Shareware... Send $5 to:'
  79.           dc.b   $0D,$0A,$0D,$0A
  80.           dc.b   'Wayne S. Arczynski',$0D,$0A
  81.           dc.b   '8646 Chelsea Bridge Way',$0D,$0A
  82.           dc.b   'Lutherville, MD   21093',$0D,$0A
  83.           dc.b   $0D,$0A,$0D,$0A
  84.           dc.b   0 
  85.  
  86. ;         done main
  87.  
  88.           Even                    ; get on even address
  89.           dc.l   inptr-inque      ; bfr ptr offset
  90.           dc.l   'WsA0'           ; Test-word & Rev #
  91.  
  92. inque:    move.l otrap13(PC),A1
  93.           move   USP,A0           ; assume USER called 
  94.           btst   #13,(SP)         ; Test old SR SUPER bit
  95.           beq.s  skp1             ; User mode?
  96.           move.l SP,A0            ; No. Move SSP to A0
  97.           addq.l #6,A0            ; Correct A0
  98. skp1:     move.w (A0)+,D0         ; BIOS Function #
  99.           move.w (A0)+,D1         ; Device #
  100.  
  101.           beq.s  skp2             ; right device?
  102.           jmp    (A1)             ; No. Goto BIOS          
  103.  
  104. skp2:     cmp.w  #3,D0            ; BCONOUT?
  105.           beq.s  bcnout           ; Yes. Doit.
  106.  
  107.           cmp.w  #8,D0            ; BCOSTAT?
  108.           beq.s  bcnstat          ; Yes. Doit.
  109.  
  110.           jmp    (A1)             ; Not us. Goto BIOS.
  111.  
  112. bcnstat:  moveq  #-1,D0           ; assume ready.
  113.           move.w inptr(PC),D1
  114.           addq.w #1,D1            ; test add to inptr
  115.           cmp.w  outptr(PC),D1    ; Buffer test
  116.           bne.s  ok               ; Buffer Full?
  117.           moveq  #0,D0            ; Yes. Not ready.
  118. ok:       rte                     ; done... bcnstat
  119.  
  120. bcnout:   move.w (A0),D1          ; Put Output char in D1
  121.           moveq  #0,D0            ; Clear D0.L
  122.           move.w inptr(PC),D0     ; inptr
  123.           cmp.w  outptr(PC),D0    ; outptr
  124.           bne.s  skp3             ; Buffer Empty?
  125.           btst   #0,$FFFA01       ; Yes. Centronics BUSY
  126.           bne.s  skp3             ; Printer Busy?
  127.                                   ; No. Print Char
  128.           lea    $FF8800,A0       ; GI Sound chip
  129.           or.w   #$700,SR         ; disable int's
  130.           move.b #15,(A0)         ; select port B
  131.           move.b D1,2(A0)         ; write char
  132.           move.b #14,(A0)         ; select port A
  133.           move.b (A0),D1          ; get old reg value
  134.           or.b   #$20,D1   
  135.           move.b D1,2(A0)         ; Strobe high
  136.           and.b  #$DF,D1
  137.           move.b D1,2(A0)         ; Strobe low
  138.  
  139.           moveq  #-1,D0           ; No Error
  140.           rte
  141.  
  142. skp3:     addq.w #1,D0            ; Increment inptr (D0)
  143.           cmp.w  outptr(PC),D0    ; Buffer full?
  144.           bne.s  skp4             ; No. Continue.
  145.           move.l $4BA,D2          ; Get 200hz timestamp
  146.           add.l  #1000,D2         ; Add 5 sec's
  147. loop:     cmp.w  outptr(PC),D0    ; Buffer full?
  148.           bne.s  skp4             ; No. Continue.
  149.           cmp.l  $4BA,D2          ; 5 sec's up?
  150.           bne.s  loop             ; No. loop
  151.           moveq  #0,D0            ; Yes. Error out.
  152.           rte
  153.  
  154. skp4:     subq.w #1,D0            ; correct D0
  155.           lea    bfrstrt(PC),A0   ; buffer base addr
  156.           move.b D1,(A0,D0.l)     ; put char in bfr
  157.           addq.w #1,inptr         ; update inptr
  158.           moveq  #-1,D0           ; No Error
  159.           rte                     ; done... bcnout
  160.  
  161. outque:   movem.l D0-D1/A0,-(SP)  ; Save reg's
  162.           lea    bfrstrt(PC),A0   ; base in A0
  163.           moveq  #0,D0            ; Clear D0
  164.           move.w outptr(PC),D0    
  165.           cmp.w  inptr(PC),D0     
  166.           beq.s  endint           ; Buffer empty?
  167.           move.b (A0,D0.l),D1     ; get char from buffer
  168.           addq.w #1,outptr        ; update output pointer
  169.                                   ; Print char
  170.           lea    $FF8800,A0       ; GI Sound chip
  171.           or.w   #$700,SR         ; disable int's
  172.           move.b #15,(A0)         ; select port B
  173.           move.b D1,2(A0)         ; write char
  174.           move.b #14,(A0)         ; select port A
  175.           move.b (A0),D1          ; get old reg value
  176.           or.b   #$20,D1   
  177.           move.b D1,2(A0)         ; Strobe high
  178.           and.b  #$DF,D1
  179.           move.b D1,2(A0)         ; Strobe low
  180.  
  181. endint:   bclr   #0,$FFFA11       ; Interrupt In-Service Register
  182.           movem.l (SP)+,D0-D1/A0  ; Pop reg's
  183.           rte
  184.           
  185. ; Vars
  186.  
  187. otrap13:  dc.l   0                ; Put old trap13 vector here
  188. inptr:    dc.w   0                ; Input buffer ptr
  189. outptr:   dc.w   0                ; Output buffer ptr 
  190.  
  191. ; output buffer
  192.  
  193. bfrstrt:  equ    outptr+2         ; 64K Buffer
  194. bfrend:   equ    bfrstrt+65536 
  195. pend:     equ    bfrend+2
  196.  
  197.  
  198.                                   ; 1K Stack (But only need 6 bytes)
  199. stack:    equ    pend+1024        ; Initial USP
  200.  
  201.